/*
 * @Descripttion: axios 配置
 * @version: 1.0.0
 * @Author: lai_hq@qq.com
 * @Date: 2022-07-30 13:44:45
 * @LastEditors: lai_hq@qq.com
 * @LastEditTime: 2022-08-05 16:08:00
 */
import Axios, { AxiosRequestConfig, AxiosResponse } from 'axios'

import { message } from 'ant-design-vue'

import cancelToken from './cancelToken'

import { useToken } from '@/utils/index'

const axios = Axios.create({
    baseURL: import.meta.env.VITE_BASE_API,
    timeout: 20000,
    withCredentials: true
})

/**
 * @description: 错误处理
 */
function errorHandle(status: number | string, msg?: string) {
    switch (status) {
        case 401:
            // 401: 未授权 或未登录状态，跳转登录页 或者重新获取token，二次重发
            break
        case 403:
            // 403 token过期
            // 清除token并跳转登录页
            // cancelToken.clearPending()
            break
        case 404:
            message.warning('请求的资源不存在')
            break
        case 500:
            message.error(msg || '系统异常，请稍后再试')
            break
        case 503:
            message.error(msg || '服务器异常，请稍后再试')
            break
        case `ERR_CANCELED`:
            message.warning('请不要重复请求')
            break
        default:
            break
    }
    // return Promise.reject()
}

// 前置拦截器（发起请求之前的拦截）
axios.interceptors.request.use(
    (config: AxiosRequestConfig) => {
        let cancel
        // 设置cancelToken对象
        config.cancelToken = new Axios.CancelToken((c) => {
            cancel = c
        })

        const token = useToken().getToken()
        if (token) {
            config.headers.Authorization = `Bearer ${token}`
        }

        return config
    },
    (error) => {
        return Promise.reject(error)
    }
)

// 后置拦截器（获取到响应时的拦截）
axios.interceptors.response.use(
    (response) => {
        // 增加延迟，相同请求不得在短时间内重复发送

        const result = response.data
        // 请求成功
        if (response.status === 200 && result.code === 0) {
            return Promise.resolve(result)
        }
        // 如果http状态不是200
        if (response.status !== 200) {
            return errorHandle(response.status)
        }
        // 如果http状态正常，数据code异常
        if (response.status === 200 && result.code !== 0) {
            return errorHandle(result.code, result.message)
        }

        return Promise.reject(response.data)
    },
    (error) => {
        const { response } = error

        if (Axios.isCancel(error)) {
            console.error('重复的请求', error)
            // errorHandle(error.code, error.message)
        }
        if (response && response.data) {
            // const code = error.response.status
            const msg = error.response.data.message
            message.error(msg || 'x')
        } else {
            message.error(error || '网络超时')
        }
        return Promise.reject(error)
    }
)

export default axios
